Virtual machines (or other execution contexts such as Docker Containers (see, e.g., www.docker.com)) are often executed by complex server hardware with multiple processor sockets. Such systems may be referred to as “NUMA” systems (where NUMA stands for “non-uniform memory access”), as each processor socket has its own local memory that provides quicker access to work executing in the same socket, but is still accessible, though less quickly, to work executing in a different socket. A combination of a processor socket and associated local memory is referred to as a “NUMA node.”
While the presence of multiple NUMA nodes in a particular system increases the processing capacity of that computer system, the existence of multiple NUMA nodes also increases the complexity of workload scheduling. Such complexity arises from the fact that the choice of which NUMA node to execute a particular execution context may be dependent on various factors such as current CPU load at the different NUMA nodes, the NUMA node(s) in which data used by a particular execution context is stored, and other factors.